package entity

import (
	"time"
)

// 操作员实体定义
type Operator struct {
	Id        int64     `xorm:"pk"`
	Name      string    //姓名（必填）
	Nickname  string    //昵称
	Password  string    //密码
	Mobile    string    //手机（必填）
	Telephone string    //座机（内线）
	Email     string    //邮箱
	DeptId    int       //所属部门ID（必填）
	DeptName  string    //所属部门名称
	Status    int       //当前操作员状态（工作、下班、休假）
	IsAdmin   bool      //是否具有管理员权限（必填）
	CreatedAt time.Time //创建用户时间
}

// 雇员/人员实体定义
type Employee struct {
	Id        int64     `xorm:"pk"`
	Name      string    //姓名（必填）
	Password  string    //密码（必填）
	Mobile    string    //手机（必填）
	Email     string    //邮件
	DeptId    int64     //所属部门ID（必填）
	LeaderId  int64     //主管领导ID（必填）
	CreatedAt time.Time //创建用户时间
	UpdateAt  time.Time //更新用户时间
	Status    int       //当前员工状态：0正常、1锁定、2离职
	Role      int       //当前员工角色：0：外包雇员；1：部门总监(司编雇员）；2：HR管理员
	Vendor    string    //厂商信息
	WorkStart string    //上班时间
	WorkEnd   string    //下班时间
}

// int64需要转为string，以免接口发送后前端丢失精度
type EmployeeInfo struct {
	Id        string    `xorm:"pk"`
	Name      string    //姓名（必填）
	Password  string    //密码（必填）
	Mobile    string    //手机（必填）
	Email     string    //邮件
	DeptId    string    //所属部门ID（必填）
	LeaderId  string    //主管领导ID（必填）
	CreatedAt time.Time //创建用户时间
	UpdateAt  time.Time //更新用户时间
	Status    int       //当前员工状态：0正常、1锁定、2离职
	Role      int       //当前员工角色：0：外包雇员；1：部门总监(司编雇员）；2：HR管理员
	Vendor    string    //厂商信息
	WorkStart string    //上班时间
	WorkEnd   string    //下班时间
}

// 部门实体定义
type Department struct {
	DeptId     int64     `xorm:"pk"` //部门ID（必填）
	DeptName   string    //部门名称（必填）
	Readme     string    //描述
	DeptHead   string    //部门负责人
	DeptHeadId int64     //部门负责人ID
	CreatedAt  time.Time //创建部门时间
	Status     int       //状态
}

// 操作日志
type OperatingRecord struct {
	Id         int64 `xorm:"pk"` //步骤ID（必填）
	Event      string
	EmployeeId int64     //业务员Id
	RecordAt   time.Time //记录时间
}

// 通用的申请
type Application struct {
	Id              int64     `xorm:"pk"` //步骤ID（必填）
	ApplicantId     int64     //申请人
	ApproverId      int64     //审批人ID
	DeptId          int64     //部门ID
	Reason          string    //加班理由
	StartDate       time.Time //加班开始时间
	EndDate         time.Time //加班终止时间
	Duration        float32   // 时长（0.5天）
	CreateAt        time.Time //申请时间
	ApproveAt       time.Time //审批时间
	Type            int       //详细类型，参见：0不限、1病假、2事假、3年假、4婚假、5丧假、6工作日班班、7周末班、8法定假日
	Status          int       //0:draft，1：send；2：delete；3:recall，4:refuse
	Note            string    //备注
	ApplicationType int       //申请类型 1 加班，2请假
}

// 加班申请信息，专门用来输出的，包含连表查询的一些其它表中的字段
type ApplicationInfo struct {
	Application   `xorm:"extends"`
	ApplicantName string  //申请人姓名
	ApproverName  string  //审批人姓名
	DeptName      string  //部门名称	employee.id
	DurationDay   float32 // 时长（天，0.5起跳）
	ApplyType     string  //详细类型，参见：0不限、1病假、2事假、3年假、4婚假、5丧假、6工作日班班、7周末班、8法定假日
	ApplyStatus   string  //0:draft，1：send；2：delete；3:recall，4:refuse
}

// 加班申请信息，专门用来输出的，包含连表查询的一些其它表中的字段
type OutputApplicationInfo struct {
	Id              string    `xorm:"pk"` //步骤ID（必填）
	ApplicantId     string    //申请人
	ApproverId      string    //审批人ID
	DeptId          string    //部门ID
	Reason          string    //加班理由
	StartDate       time.Time //加班开始时间
	EndDate         time.Time //加班终止时间
	Duration        float32   // 时长（0.5）
	CreateAt        time.Time //申请时间
	ApproveAt       time.Time //审批时间
	Type            int       //类型 0、不限、1工作日、2周末、3法定假日、4其它
	Status          int       //0:draft，1：send；2：delete；3:recall，4:refuse
	Note            string    //备注
	ApplicantName   string    //申请人姓名
	ApproverName    string    //审批人姓名
	DeptName        string    //部门名称	employee.id
	DurationDay     float32   // 时长（天，0.5起跳）
	ApplyType       string    //类型 0、不限、1工作日、2周末、3法定假日、4其它
	ApplyStatus     string    //0:draft，1：send；2：delete；3:recall，4:refuse
	ApplicationType int       //申请类型
}

// 加班申请
type Overtime struct {
	Id              int64     `xorm:"pk"` //步骤ID（必填）
	ApplicantId     int64     //申请人
	ApproverId      int64     //审批人ID
	DeptId          int64     //部门ID
	Reason          string    //加班理由
	StartDate       time.Time //加班开始时间
	EndDate         time.Time //加班终止时间
	Duration        float32   // 时长（0.5天）
	CreateAt        time.Time //申请时间
	ApproveAt       time.Time //审批时间
	Type            int       //类型 0、不限、1工作日、2周末、3法定假日、4其它
	Status          int       //0:draft，1：send；2：delete；3:recall，4:refuse
	Note            string    //备注
	ApplicationType int       //申请类型
}

// 加班申请信息，专门用来输出的，包含连表查询的一些其它表中的字段
type OvertimeInfo struct {
	Overtime      `xorm:"extends"`
	ApplicantName string  //申请人姓名
	ApproverName  string  //审批人姓名
	DeptName      string  //部门名称	employee.id
	DurationDay   float32 // 时长（天，0.5起跳）
	ApplyType     string  //类型 0、不限、1工作日、2周末、3法定假日、4其它
	ApplyStatus   string  //0:draft，1：send；2：delete；3:recall，4:refuse
}

// 加班申请信息，专门用来输出的，包含连表查询的一些其它表中的字段
type OutputOvertimeInfo struct {
	Id              string    `xorm:"pk"` //步骤ID（必填）
	ApplicantId     string    //申请人
	ApproverId      string    //审批人ID
	DeptId          string    //部门ID
	Reason          string    //加班理由
	StartDate       time.Time //加班开始时间
	EndDate         time.Time //加班终止时间
	Duration        float32   // 时长（0.5）
	CreateAt        time.Time //申请时间
	ApproveAt       time.Time //审批时间
	Type            int       //类型 0、不限、1工作日、2周末、3法定假日、4其它
	Status          int       //0:draft，1：send；2：delete；3:recall，4:refuse
	Note            string    //备注
	ApplicantName   string    //申请人姓名
	ApproverName    string    //审批人姓名
	DeptName        string    //部门名称	employee.id
	DurationDay     float32   // 时长（天，0.5起跳）
	ApplyType       string    //类型 0、不限、1工作日、2周末、3法定假日、4其它
	ApplyStatus     string    //0:draft，1：send；2：delete；3:recall，4:refuse
	ApplicationType int       //申请类型
}

// 请假申请
type Vacation struct {
	Id              int64     `xorm:"pk"` //步骤ID（必填）
	ApplicantId     int64     //申请人
	ApproverId      int64     //审批人人ID
	DeptId          int64     //部门ID
	Reason          string    //请假理由
	StartDate       time.Time //开始假期时间
	EndDate         time.Time //假期终止时间
	Duration        float32   // 时长（小时）
	CreateAt        time.Time //申请时间
	ApproveAt       time.Time //审批时间
	Type            int       //类型 0、不限、1病假、2事假、3年假、4婚假、5丧家、6其它
	Status          int       //0:draft，1：send；2：delete；3:recall，4:refuse
	Note            string    //备注
	ApplicationType int       //申请类型
}

// 假期申请信息，专门用来输出的，包含连表查询的一些其它表中的字段
type VacationInfo struct {
	Vacation      `xorm:"extends"`
	ApplicantName string  //申请人姓名
	ApproverName  string  //审批人姓名
	DeptName      string  //部门名称	employee.id
	DurationDay   float32 // 时长（天，0.5起跳）
	ApplyType     string  //类型 0、不限、1病假、2事假、3年假、4婚假、5丧家、6其它
	ApplyStatus   string  //0:draft，1：send；2：delete；3:recall，4:refuse
}

type OutputVacationInfo struct {
	Id            string    `xorm:"pk"` //步骤ID（必填）
	ApplicantId   string    //申请人
	ApproverId    string    //审批人人ID
	DeptId        string    //部门ID
	Reason        string    //请假理由
	StartDate     time.Time //开始假期时间
	EndDate       time.Time //假期终止时间
	Duration      float32   // 时长（小时）
	CreateAt      time.Time //申请时间
	ApproveAt     time.Time //审批时间
	Type          int       //类型 0、不限、1病假、2事假、3年假、4婚假、5丧家、6其它
	Status        int       //0:draft，1：send；2：delete；3:recall，4:refuse
	Note          string    //备注
	ApplicantName string    //申请人姓名
	ApproverName  string    //审批人姓名
	DeptName      string    //部门名称	employee.id
	DurationDay   float32   // 时长（天，0.5起跳）
	ApplyType     string    //类型 0、不限、1病假、2事假、3年假、4婚假、5丧家、6其它
	ApplyStatus   string    //0:draft，1：send；2：delete；3:recall，4:refuse
}

// 证件类型
type ECertificateType int32

// 用户（投资者）实体定义
type Customer struct {
	Id               int64            `xorm:"pk"`
	Name             string           //姓名（必填）/单位名称
	Password         string           //密码
	Mobile           string           //手机（必填）
	Telephone        string           //座机（内线）
	Email            string           //邮箱
	IsOrganization   bool             //是否组织or法人，true:法人机构，false:自然人.
	CertType         ECertificateType //证件类型
	IdNumber         string           //证件号码（自然人）/ 社会信用代码（法人）
	IndustryInvolved string           //所属行业
	CeoName          string           //法人代表
	CertUrl          string           //上传件Url
	CreatedAt        time.Time        //创建用户时间
	LastLoginAt      time.Time        //最近登录时间
	Status           int              //状态：正常、注销、锁定
}

// 操作员登录日志
type OperatorLoginLog struct {
	Id            int64     `xorm:"pk"` //步骤ID（必填）
	OperatorId    int64     //业务员Id
	LoginTime     time.Time //登录时间
	LogoutTime    time.Time //登出时间
	LoginType     int       //登录类型(密码 or 短信)
	DeviceNo      string    //设备号
	IpAddress     string    //Logo Url
	IsAdmin       int       //是否管理员权限
	LoginOrLogout int       //登入0/登出1
	ClientType    int       //客户端类型
	ClientVersion string    //客户端版本
	Token         string    //token
}

// 客户登录日志
type CustomerLoginLog struct {
	Id            int64     `xorm:"pk"` //步骤ID（必填）
	CustomerId    int64     //用户Id
	LoginTime     time.Time //登录时间
	LogoutTime    time.Time //登出时间
	LoginType     int       //登录类型(密码 or 短信)
	DeviceNo      string    //设备号
	IpAddress     string    //Logo Url
	IsAdmin       int       //是否管理员权限
	LoginOrLogout int       //登入0/登出1
	ClientType    int       //客户端类型
	ClientVersion string    //客户端版本
	Token         string    //登录时搞到的token
}

type CustomerType struct {
	Id   int
	Type string
}

type OpinionType struct {
	Id   int
	Type string
}

type CertificateTypes struct {
	Id   int
	Type string
}

// 标签
type Label struct {
	Id        int64     `xorm:"pk"` //ID（必填）
	Label     string    //标题
	CreatedAt time.Time //创建时间
	Remark    string    //说明
	Author    int64     //作者ID
}

// 邮件
type Message struct {
	MsgId          int64     `xorm:"pk"` //ID（必填）
	Title          string    //标题
	Body           string    //正文
	Sender         string    //发送者：
	SenderId       int64     //发送者ID,
	ReceiverIdList string    //接收者ID列表，分号分隔
	SendAt         time.Time //发送时间
	Type           int       //类型 1：发送给业务员， 2，发送给客户
	Status         int       //状态 0:draft，1：send；2：delete；3:recall
}

// 接收邮件的信息
type ReceivingMessage struct {
	Id         int64
	MsgId      int64 //邮件ID
	ReceiverId int64
	ReceiveAt  time.Time //接收时间
	ReadFlag   int       //1 未读，2已读
	Type       int       //类型 1：发送给业务员， 2，发送给客户
	ReadAt     time.Time //读取时间
}

type AttendanceInfo struct {
	//Id           int64
	//Mobile       string
	Date           string
	DayDiff        int
	StartTime      int
	EndTime        int
	OvertimeHour   float64
	IsWorkDay      bool //是否为工作日
	IsNormal       bool //考勤数据是否正常，如为FALSE，需查看是否休假、迟到、早退等情况
	IsNormalAM     bool //上午考勤是否正常，如异常，需查看是否上午休假、迟到
	IsNormalPM     bool //下午考勤异常，如异常，需查看是否下午休假、早退
	IsLate         bool //是否迟到
	IsLateAM       bool
	IsLatePM       bool
	IsLeaveEarly   bool //是否早退
	IsLeaveEarlyAM bool
	IsLeaveEarlyPM bool
	IsVacationAM   bool //是否上午休假
	IsVacationPM   bool //是否下午休假
	IsVacation     bool //是否休假
	IsAbsent       bool //旷工
	IsAbsentAM     bool
	IsAbsentPM     bool
	IsLackData     bool //无考勤数据
	IsOverTime     bool //是否加班（需加班申请通过后有效）
}

type AttendanceData struct {
	Name            string
	Mobile          string
	ActualWorkDays  float64 //实际工作天数
	LateTimes       int     //迟到次数
	LeaveEarlyTimes int     //早退次数
	LackTimes       int     //无考勤次数
	AbsentTimes     int     //旷工次数（打卡数据不完整，超过半小时以上）
	OTDays          float64 //加班天数
	OTHours         float64 //加班小时数
	VacationDays    float64 //休假天数
	ExceptionDays   int     //异常天数，需要人工核对
	WorkDays        int
}
